package org.farec.tcc.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.farec.tcc.modelo.Usuario;

public class UsuarioDAO {
	
	private Connection connection;
	
	public UsuarioDAO(Connection connection)
	{
		this.connection = connection;
	}
	
	public void adiciona(Usuario usuario)
	{
		try
		{
			PreparedStatement stmt = null;
			ResultSet rs = null;
			
			String sql = "SELECT gr.id as grupo, ar.id as area FROM grupo as gr, area as ar "+
						 "WHERE gr.nome ILIKE ? and ar.nome ILIKE ? and ar.idempresa=?";
			
			stmt = this.connection.prepareStatement(sql);
			stmt.setString(1, usuario.getGrupo());
			stmt.setString(2, usuario.getArea());
			stmt.setInt(3, usuario.getCodEmpresa());
			
			rs = stmt.executeQuery();
			
			if(rs.next())
			{
				usuario.setCodGrupo(rs.getInt("grupo"));
				usuario.setCodArea(rs.getInt("area"));
		
				stmt = this.connection.prepareStatement("SELECT id from responsavel where nome ILIKE ? and idempresa=?");
				
				stmt.setString(1, usuario.getResponsavel());
				stmt.setInt(2, usuario.getCodEmpresa());
				
				rs = stmt.executeQuery();
				
				if(rs.next())
				{
					/*
					 * Se o usuario for responsavel
					 */
					
				    usuario.setCodResponsavel(rs.getInt("id"));
				
					String sql2 = "INSERT INTO usuario(nome, usuario, senha, idgrupo, email, idarea, idresponsavel,idempresa) VALUES(?,?,?,?,?,?,?,?)";
					
					stmt = connection.prepareStatement(sql2);
					
					//seta os dados
					stmt.setString(1, usuario.getNome());
					stmt.setString(2, usuario.getUsuario());
					stmt.setString(3, usuario.getSenha());
					stmt.setInt(4, usuario.getCodGrupo());
					stmt.setString(5, usuario.getEmail());
					stmt.setInt(6, usuario.getCodArea());
					stmt.setInt(7, usuario.getCodResponsavel());
					stmt.setInt(8, usuario.getCodEmpresa());
								
					stmt.execute();
					stmt.close();
				}
				
				else
				{
					String sql2 = "INSERT INTO usuario(nome, usuario, senha, idgrupo, email, idarea,idempresa) VALUES(?,?,?,?,?,?,?)";
					
					stmt = connection.prepareStatement(sql2);
					
					//seta os dados
					stmt.setString(1, usuario.getNome());
					stmt.setString(2, usuario.getUsuario());
					stmt.setString(3, usuario.getSenha());
					stmt.setInt(4, usuario.getCodGrupo());
					stmt.setString(5, usuario.getEmail());
					stmt.setInt(6, usuario.getCodArea());
					stmt.setInt(7, usuario.getCodEmpresa());
								
					stmt.execute();
					stmt.close();
				}
			}

		}
		catch(SQLException e)
		{
			throw new RuntimeException(e);
		}
	}
	
	public List<Usuario> getLista(int codEmpresa)
	{
		try
		{
			
			String sql = "SELECT us.nome, usuario, gr.nome as grupo, email, ar.nome as area, us.idresponsavel FROM usuario as us, grupo as gr, area as ar "+
						 "WHERE us.idgrupo=gr.id and us.idarea= ar.id and us.idempresa=? order by us.nome"	;
			PreparedStatement stmt = this.connection.prepareStatement(sql);
			stmt.setInt(1, codEmpresa);
			
			ResultSet rs = stmt.executeQuery();
			List<Usuario> usuarios = new ArrayList<Usuario>();
			
			while(rs.next())
			{
				//Criando um nova instancia
				Usuario usuario = new Usuario();
				usuario.setNome(rs.getString("nome"));
				usuario.setUsuario(rs.getString("usuario"));
				usuario.setGrupo(rs.getString("grupo"));
				usuario.setEmail(rs.getString("email"));
				usuario.setArea(rs.getString("area"));
				usuario.setCodResponsavel(rs.getInt("idresponsavel"));
								
				//Adicionando objeto a lista
				usuarios.add(usuario);
			}
			
			rs.close();
			stmt.close();
			return usuarios;
		}
		catch(SQLException e)
		{
			throw new RuntimeException(e);
		}
		
	}
	
	public void altera(Usuario usuario)
	{	
		try
		{
			PreparedStatement stmt = null;
			ResultSet rs = null;
			
			String sql = "SELECT gr.id as grupo, ar.id as area FROM grupo as gr, area as ar "+
						 "WHERE gr.nome ILIKE ? and ar.nome ILIKE ? and ar.idempresa=?";
			
			stmt = this.connection.prepareStatement(sql);
			stmt.setString(1, usuario.getGrupo());
			stmt.setString(2, usuario.getArea());
			stmt.setInt(3, usuario.getCodEmpresa());
			
			rs = stmt.executeQuery();
			
			if(rs.next())
			{
				usuario.setCodGrupo(rs.getInt("grupo"));
				usuario.setCodArea(rs.getInt("area"));
		
				stmt = this.connection.prepareStatement("SELECT id from responsavel where nome ILIKE ? and idempresa=?");
				
				stmt.setString(1, usuario.getResponsavel());
				stmt.setInt(2, usuario.getCodEmpresa());
				
				rs = stmt.executeQuery();
				
				if(rs.next())
				{
					/*
					 * Se o usuario for responsavel
					*/
				    usuario.setCodResponsavel(rs.getInt("id"));
				
				    String sql2 ="BEGIN;" +
							"DELETE from usuario WHERE usuario=?;" +
							"INSERT INTO usuario(nome,usuario,senha,idgrupo,email,idarea,idresponsavel,idempresa) VALUES(?,?,?,?,?,?,?,?); " +
							"COMMIT;";
					
					stmt = this.connection.prepareStatement(sql2);
					
					stmt.setString(1, usuario.getUsuario());
			
					//seta os dados
					stmt.setString(2, usuario.getNome());
					stmt.setString(3, usuario.getUsuario());
					stmt.setString(4, usuario.getSenha());
					stmt.setInt(5, usuario.getCodGrupo());
					stmt.setString(6, usuario.getEmail());
					stmt.setInt(7, usuario.getCodArea());
					stmt.setInt(8, usuario.getCodResponsavel());
					stmt.setInt(9, usuario.getCodEmpresa());
					
					stmt.execute();
					stmt.close();
				}
				
				else
				{
					String sql2 ="BEGIN;" +
							"DELETE from usuario WHERE usuario=?;" +
							"INSERT INTO usuario(nome, usuario, senha, idgrupo, email, idarea, idempresa) VALUES(?,?,?,?,?,?,?);" +
							"COMMIT;";
					
					stmt = this.connection.prepareStatement(sql2);
					
					stmt.setString(1, usuario.getUsuario());
					
					//seta os dados
					stmt.setString(2, usuario.getNome());
					stmt.setString(3, usuario.getUsuario());
					stmt.setString(4, usuario.getSenha());
					stmt.setInt(5, usuario.getCodGrupo());
					stmt.setString(6, usuario.getEmail());
					stmt.setInt(7, usuario.getCodArea());
					stmt.setInt(8, usuario.getCodEmpresa());
					
					stmt.execute();
					stmt.close();
				}
			}
		}
		catch(SQLException e)
		{
			throw new RuntimeException(e);
		}
	}
	
	public void remove(Usuario usuario)
	{
		try
		{
			PreparedStatement stmt = this.connection.prepareStatement("DELETE from usuario where usuario=? and idempresa=?");
			stmt.setString(1,usuario.getUsuario());
			stmt.setInt(2, usuario.getCodEmpresa());
			
			stmt.execute();
			stmt.close();
		}
		catch(SQLException e)
		{
			throw new RuntimeException(e);
		}
	}

	public boolean existeUsuario(Usuario usuario)
	{
		try
		{
			PreparedStatement stmt = null;
					
		    String sql = "SELECT usuario, email, idgrupo, gr.nome as grupo, idarea FROM usuario as us, grupo as gr " +
		    			 "WHERE usuario ILIKE ? and senha=? and us.idgrupo=gr.id";
			stmt = this.connection.prepareStatement(sql);
			
			stmt.setString(1, usuario.getUsuario());
			stmt.setString(2, usuario.getSenha());
			
			ResultSet rs = stmt.executeQuery();
			
			if(rs.next())
			{
				usuario.setUsuario(rs.getString("usuario"));
				usuario.setCodGrupo(rs.getInt("idgrupo"));
				usuario.setAlerta(false);
				usuario.setGrupo(rs.getString("grupo"));
				usuario.setCodArea(rs.getInt("idarea"));
				
				return true;
			}
						
			stmt.close();
			rs.close();
			
			
		}
		catch(Exception e)
		{
			throw new RuntimeException(e);
		}
		return false;
	}
	
	public Usuario existeUsuario_ParaEmail(Usuario usuario)
	{
		
			ResultSet rs;
			try
			{
				PreparedStatement stmt = this.connection.prepareStatement("select usuario,email,senha from usuario where usuario=? and email=?");
				stmt.setString(1, usuario.getUsuario());
				stmt.setString(2, usuario.getEmail());
				rs=stmt.executeQuery();
				
				if(rs.next())
				{
					usuario.setAlerta(true);
				}
				
				else
				{
					usuario.setAlerta(false);
				}
				stmt.close();
				rs.close();
			
			}
			
			catch(SQLException e)
			{
				throw new RuntimeException(e);
			}
			return usuario;

	}

	public Usuario existeUsuario_ParaTrocaSenha(Usuario usuario, String val)
	{
		
			ResultSet rs;
			try
			{
				PreparedStatement stmt = this.connection.prepareStatement("select usuario,senha from usuario where usuario=? and senha=?");
				stmt.setString(1, usuario.getUsuario());
				stmt.setString(2, val);
				rs=stmt.executeQuery();
				
				if(rs.next())
				{
					usuario.setAlerta(true);
				}
				
				else
				{
					usuario.setAlerta(false);
				}
				stmt.close();
				rs.close();
			
			}
			
			catch(SQLException e)
			{
				throw new RuntimeException(e);
			}
			return usuario;

	}

	public Usuario buscaPorUsuario(int codEmpresa, String user)
	{
		try
		{
			PreparedStatement stmt = null;
			
			String sql ="SELECT us.nome, us.usuario, us.senha, us.email, gr.nome as grupo, ar.nome as area, us.idresponsavel as idresponsavel FROM usuario as us, grupo as gr, area as ar " +
						"WHERE usuario=? and us.idgrupo=gr.id and us.idarea=ar.id and us.idempresa=?";
			
			stmt = this.connection.prepareStatement(sql);
			
			stmt.setString(1, user);
			stmt.setInt(2, codEmpresa);			
			
			ResultSet rs = stmt.executeQuery();
			Usuario usuario = new Usuario();
			if(rs.next())
			{
				usuario.setNome(rs.getString("nome"));
				usuario.setUsuario(rs.getString("usuario"));
				usuario.setSenha(rs.getString("senha"));
				usuario.setGrupo(rs.getString("grupo"));
				usuario.setEmail(rs.getString("email"));
				usuario.setArea(rs.getString("area"));
				usuario.setCodResponsavel(rs.getInt("idresponsavel"));
			}
			rs.close();
			stmt.close();
			return usuario;
			
		}
		catch(SQLException e)
		{
			throw new RuntimeException(e);
		}
		
	}

	public Usuario getUsuario(Usuario usuario)
	{
		ResultSet rs;
		try
		{
			PreparedStatement stmt = this.connection.prepareStatement("select usuario,senha from usuario WHERE usuario ILIKE ? or email ILIKE ?");
			stmt.setString(1, usuario.getUsuario());
			stmt.setString(2, usuario.getEmail());
			
			rs=stmt.executeQuery();
			
			if(rs.next())
			{
				usuario.setAlerta(true);
				usuario.setSenha(rs.getString("senha"));
			}
			
			else
			{
				usuario.setAlerta(false);
			}
			stmt.close();
			rs.close();
		
		}
		
		catch(SQLException e)
		{
			throw new RuntimeException(e);
		}
		return usuario;
		
	}
	
	public Usuario getUsuarioUp(Usuario usuario)
	{
		ResultSet rs;
		try
		{
			PreparedStatement stmt = this.connection.prepareStatement("select usuario,senha from usuario WHERE usuario!=? and email ILIKE ?");
			stmt.setString(1, usuario.getUsuario());
			stmt.setString(2, usuario.getEmail());
			
			rs=stmt.executeQuery();
			
			if(rs.next())
			{
				usuario.setAlerta(true);
				usuario.setSenha(rs.getString("senha"));
			}
			
			else
			{
				usuario.setAlerta(false);
			}
			stmt.close();
			rs.close();
		
		}
		
		catch(SQLException e)
		{
			throw new RuntimeException(e);
		}
		return usuario;
		
	}

	public void alteraSenha(Usuario usuario) {
		
		String sql = "UPDATE usuario SET senha=? where usuario ILIKE ?";
		try
		{		
			PreparedStatement stmt = this.connection.prepareStatement(sql);
			stmt.setString(1, usuario.getSenha());
			stmt.setString(2, usuario.getUsuario());
	
			stmt.execute();
			stmt.close();
		}
		catch(SQLException e)
		{
			throw new RuntimeException(e);
		}
	}

	public int verificaEmpresa(Usuario usuario)
	{
		try
		{
			PreparedStatement stmt = this.connection.prepareStatement("SELECT idempresa from usuario WHERE usuario=?");
			
			stmt.setString(1, usuario.getUsuario());
			
			ResultSet rs = stmt.executeQuery();
			
			if(rs.next())
			{
				return rs.getInt("idempresa");
			}
		}
		
		catch(SQLException e)
		{
			throw new RuntimeException(e);
		}
		
		return 0;
	}
	
}